<?php

/**
 * 算法说明：将10000块钱分成5份，且每一份之间的相差的值$d不一样，并且相差$d得大于100。
 * aa
 */


$sum  = 10000;
$diff = 100;
$count = 5;

$return = array();
$min    = 0;
$i         = 1;
while($i < $count) {
die;
    // 随机数不符合要求时的结果初始化
    if(isset($return[$i]) || isset($return[$i+1])) {
        unset($return[$i]);
        unset($return[$i+1]);
    }

    // 剩余数
    $remain_sum = $sum - array_sum($return);
    // 剩余需要随机的个数
    $remain_count = intval($count - count($return));
    // 高斯求最小差值和，分两部分：S = n(n+1)(2n+4)/12 + $diff * ((n-1)(n-2)/2)
    $min_diff = $remain_count * ($remain_count - 1) * (2 * ($remain_count - 1) + 4) / 12 + ($remain_count * ($remain_count - 1) / 2) * $diff;
    // 随机范围的最小值
    $min = $i == 1 ? 1 : $return[$i-1] + $diff + 1;

    // 在范围内获取随机数
    mt_srand((double)microtime() * 1000000);
    // 随机范围的最大值
    $rand_max   = intval(($remain_sum - $min_diff) / $remain_count);
    // 产生随机数
    $min        = mt_rand($min, $rand_max);
    // 放入返回的数组
    $return[$i] = $min;
    if($i == $count - 1) {
        // 最后一个随机数直接取总数减去前面的随机数
        $return[$i+1] = $remain_sum - $min;
    }

    if(check_diff($return) === false) {
        $i--;
        continue;
    }

    $i++;
}

var_dump($return);die;

// 判断数组内是否有差值相等
function check_diff($arr) {
    if(empty($arr)) {
        return false;
    }

    $arr = array_map('intval', $arr);
    sort($arr);

    $count = count($arr);
    $diff_arr = array();
    for($i = $count - 1; $i >= 0; $i --) {
        for ($j = 0; $j < $count; $j ++) {
            if($arr[$i] <= $arr[$j]) {
                continue 2;
            }
            $diff_arr[] = $arr[$i] - $arr[$j];
        }
    }

    if(count($diff_arr) === count(array_unique($diff_arr))) {
        return true;
    }

    return false;
}